{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Особенности работы с типами данных и структурами."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Цель**: Познакомиться с типами и структурами данных в Python, необходимыми в процессе работы специалиста инженера данных.<br>\n",
    "**Задачи:**\n",
    "- Повторить основные типы данных релизованные в Python;\n",
    "- Изучить типы данных предоставлямые расширениями Python;\n",
    "- Познакомится со структурами данных Python и особенностями их реализации;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Основные типы данных Python.\n",
    "\n",
    "Python - является языком программирования с динамическими типами данных. Это означение что в отличии от других языков программирования при объявлении переменных у разработчика нет необходимости в объявлени типа данных.<br>\n",
    "\n",
    "``` Java\n",
    "int sum = 12\n",
    "double pi = 3.14159\n",
    "char a = 'a'\n",
    "```\n",
    "_Листинг 1. Пример объявления переменных в Java._<br>\n",
    "\n",
    "```Python\n",
    "summ = 12\n",
    "pi = 3.14\n",
    "a = 'a'\n",
    "```\n",
    "_Листинг 2. Пример объявления переменных в Python._ <br>\n",
    "\n",
    "**Плюсы и минусы статической и динамической типизации:**<br>\n",
    "- Динамическая типизация удобна при работе с большими данными, в случае когда на один кадр данных приходится много значений разного типа;\n",
    "- Статическая типизация, позволяет строже следить за входными и выходными данными т.к. отсутсвиует риск неконтролируемой смены типа в процессе преобразований.\n",
    "- ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Типы данных предоставляемые стандартными пакетами Python\n",
    "Одним из главных приемущест Python, являются его библиотеки. Стандартные библиотеки python представляют собой набор удобных инструментов, которы можно использовать для корректной работы с данными."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Модуль datetime"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Модуль `datetime` предоставляет классы для обработки времени и даты разными способами. Поддерживается и стандартный способ представления времени, однако больший упор сделан на простоту манипулирования датой, временем и их частями."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from datetime import date, time, datetime"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Класс `datetime.date(year, month, day)` - стандартная дата. Атрибуты: year, month, day. Неизменяемый объект."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.date(2024, 1, 1)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday_date = date(2024, 1, 1)\n",
    "birthday_date"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Класс `datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)` - стандартное время, не зависит от даты. Атрибуты: `hour`, `minute`, `second`, `microsecond`, `tzinfo`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.time(20, 31)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meeting_time = time(hour=20, minute=31)\n",
    "meeting_time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2024, 1, 1, 20, 31)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday_metting = datetime(2024, 1,1,20,31)\n",
    "birthday_metting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.timedelta(days=365)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "delta = date(2024, 1, 1) - date(2023, 1, 1)\n",
    "delta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Задание 1\n",
    "Даны два списка дат: в первом списке содержатся даты начала публикации постов, а во втором - даты окончания публикации. Однако при восстановлении базы данных даты были перепутаны, то есть индексы в первом списке соответствуют индексам второго списка. Требуется вычислить продолжительность каждого периода публикации, находя разницу между датой начала и датой окончания для каждой пары дат."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# исходные данные\n",
    "start_dates = [\n",
    "    datetime(2023, 12, 23, 4, 21, 11),\n",
    "    datetime(2024, 1, 15, 23, 1, 15),\n",
    "    datetime(2023, 8, 19, 12, 0, 0),\n",
    "    datetime(2022, 9, 11, 7, 15, 11),\n",
    "    datetime(2018, 1, 23, 10, 0, 0),\n",
    "]\n",
    "\n",
    "end_dates = [\n",
    "    datetime(2024, 4, 8, 19, 58, 11),\n",
    "    datetime(2022, 1, 1, 12, 10, 15),\n",
    "    datetime(2017, 4, 1, 7, 0, 0),\n",
    "    datetime(2024, 2, 29, 7, 15, 11),\n",
    "    datetime(2018, 1, 23, 13, 0, 0),\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_timedeltas(start_dates: list, end_dates: list) -> list:\n",
    "    \n",
    "    time_deltas = [] \n",
    "    # ваш код напишите здесь\n",
    "    ...\n",
    "    \n",
    "    return time_deltas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "time_deltas = get_timedeltas(start_dates, end_dates)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Задание 2\n",
    "У вас есть список дат в формате `%Y-%m-%d %H:%M:%S` (например, 2023-12-23 04:21:11). Необходимо определить, сколько времени прошло с момента первой даты до каждой последующей даты в списке и вывести это время в часах, минутах и секундах."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# исходные данные\n",
    "dates_list = [\n",
    "    \"2023-12-23 04:21:11\",\n",
    "    \"2024-01-15 23:01:15\",\n",
    "    \"2023-08-19 12:00:00\",\n",
    "    \"2022-09-11 07:15:11\",\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#  ваш код напишите здесь"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Задание 3\n",
    "\n",
    "У вас есть список дат в формате `%Y-%m-%d` (например, 2023-12-23). Необходимо определить, какой день недели был каждый из этих дней и вывести результат в виде строки вида \"Дата - День недели\" (например, 2023-12-23 - Понедельник).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# исходные данные\n",
    "dates_list = [\"2023-12-23\", \"2024-01-15\", \"2023-08-19\", \"2022-09-11\"]\n",
    "weekdays = [\n",
    "    \"Понедельник\",\n",
    "    \"Вторник\",\n",
    "    \"Среда\",\n",
    "    \"Четверг\",\n",
    "    \"Пятница\",\n",
    "    \"Суббота\",\n",
    "    \"Воскресенье\",\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ваш код напишите здесь"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Задание 3\n",
    "\n",
    "У вас есть список дат и времен в формате `%Y-%m-%d %H:%M:%S` (например, 2023-12-23 15:30:00). Необходимо определить, какое время было в каждой из этих дат и времен в часовом поясе \"Europe/Moscow\" и вывести результат в виде строки вида \"Дата и время - Время в часовом поясе Europe/Moscow\" (например, 2023-12-23 15:30:00 - 18:30:00)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "datetime_list = [\n",
    "    \"2023-12-23 15:30:00\",\n",
    "    \"2024-01-15 10:45:00\",\n",
    "    \"2023-08-19 20:15:00\",\n",
    "    \"2022-09-11 05:00:00\",\n",
    "]\n",
    "\n",
    "moscow_offset = 3  # UTC+3 для Moscow Standard Time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
